package com.ww.springboot.boot.spring.demo1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 1现在开始初始化容器
 * 2这是 BeanFactoryPostProcessor 实现类构造器！！
 * 3BeanFactoryPostProcessor 调用 postProcessBeanFactory 方法
 * 4这是 BeanPostProcessor 实现类构造器！！
 * 5这是 InstantiationAwareBeanPostProcessorAdapter 实现类构造器！！
 * 6InstantiationAwareBeanPostProcessor 调用 postProcessBeforeInstantiation 方法
 * 7【构造器】调用Person的构造器实例化
 * 8InstantiationAwareBeanPostProcessor 调用 postProcessPropertyValues 方法
 * 9【注入属性】注入属性address
 * 10【注入属性】注入属性name
 * 11【注入属性】注入属性phone
 * 12【BeanNameAware接口】调用BeanNameAware.setBeanName()
 * 13【BeanFactoryAware接口】调用BeanFactoryAware.setBeanFactory()
 * 14BeanPostProcessor 接口方法 postProcessBeforeInitialization对属性进行更改！
 * 15【InitializingBean接口】调用 InitializingBean.afterPropertiesSet()
 * 16【init-method】调用<bean>的 init-method属性指定的初始化方法
 * 17BeanPostProcessor 接口方法 postProcessAfterInitialization对属性进行更改！
 * 18InstantiationAwareBeanPostProcessor 调用 postProcessAfterInitialization方法
 * 19容器初始化成功
 * 20Person [address=广州, name=张三, phone=110]
 * 21现在开始关闭容器！
 * 22【DiposibleBean接口】调用DiposibleBean.destory()
 * 23【destroy-method】调用<bean>的destroy-method属性指定的销毁方法
 */
public class BeanLifeCycle {

    public static void main(String[] args) {

        System.out.println("现在开始初始化容器");

        ApplicationContext factory = new ClassPathXmlApplicationContext("static/xml/bean.xml");
        System.out.println("容器初始化成功");
        //得到Preson，并使用
        Person person = factory.getBean("person",Person.class);
        System.out.println(person);

        System.out.println("现在开始关闭容器！");
        ((ClassPathXmlApplicationContext)factory).registerShutdownHook();
    }
}